package com.itheima.service.mongo.impl;

import com.itheima.domain.mongo.Comment;
import com.itheima.domain.mongo.Movement;
import com.itheima.domain.mongo.Video;
import com.itheima.service.mongo.CommentService;
import com.itheima.vo.PageBeanVo;
import org.apache.dubbo.config.annotation.Service;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;

import java.util.List;

@Service
public class CommentServiceImpl implements CommentService {

    @Autowired
    private MongoTemplate mongoTemplate;

    //对动态添加评论
    @Override
    public Integer saveMovementComment(Comment comment) {
        //1.向评论表添加数据
        comment.setCreated(System.currentTimeMillis());//创建时间
        comment.setPubType(1);//对动态进行操作

        //动态所属用户Id
        comment.setPublishUserId(mongoTemplate.findById(comment.getPublishId(), Movement.class).getUserId());
        mongoTemplate.save(comment);//保存评论

        //2. 改变动态表中的被评论动态的对应操作的数量
        //2.1 使用动态id作为查询条件
        Query query = new Query(Criteria.where("id").is(comment.getPublishId()));

        //2.2 组装更新字段
        Update update = new Update();
        if (comment.getCommentType() == 1) {
            update.inc("likeCount", 1);//点赞一次，点赞数量+1
        } else if (comment.getCommentType() == 2) {
            update.inc("commentCount", 1);//评论一次，评论数+1
        } else {
            update.inc("loveCount", 1);//喜欢数+1
        }

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query, update, Movement.class);
        //3.返回操作类型对应的次数
        Movement movement = mongoTemplate.findById(comment.getPublishId(), Movement.class);
        if (comment.getCommentType() == 1) {
            return movement.getLikeCount();//返回点赞数量
        } else if (comment.getCommentType() == 2) {
            return movement.getCommentCount();//返回评论数
        } else {
            return movement.getLoveCount();//返回喜欢的人数
        }
    }

    //给视频评论（点赞，喜欢，评论）
    @Override
    public Integer saveVideoComment(Comment comment) {
        //1.向评论表添加数据
        comment.setCreated(System.currentTimeMillis());//创建时间
        comment.setPubType(2);//对视频进行操作
        //动态所属用户Id
        comment.setPublishUserId(mongoTemplate.findById(comment.getPublishId(), Video.class).getUserId());
        mongoTemplate.save(comment);//保存评论

        //2. 改变视频表中的被评论动态的对应操作的数量
        //2.1 使用视频id作为查询条件
        Query query = new Query(Criteria.where("id").is(comment.getPublishId()));

        //2.2 组装更新字段
        Update update = new Update();

        update.inc(comment.getCol(), 1);//点赞一次，点赞数量+1

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query, update, Video.class);

        //3.返回操作类型对应的次数
        Video video = mongoTemplate.findById(comment.getPublishId(), Video.class);
        if (comment.getCommentType() == 1) {
            return video.getLikeCount();//返回点赞数量
        } else if (comment.getCommentType() == 2) {
            return video.getCommentCount();//返回评论数
        } else {
            return video.getLoveCount();//返回喜欢的人数
        }
    }

    //删除动态评论（点赞，喜欢，评论）
    @Override
    public Integer deleteMovementComment(Comment comment) {
        //1.从评论表删除数据
        Query query = new Query(Criteria.where("userId").is(comment.getUserId())
                .and("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType()));
        //删除评论
        mongoTemplate.remove(query, Comment.class);

        //2. 改变动态表中的被评论动态的对应操作的数量
        //2-1 使用动态id作为查询条件
        Query query1 = new Query(Criteria.where("id").is(comment.getPublishId()));
        //2.2组装更新字段
        Update update = new Update();
        if (comment.getCommentType() == 1) {
            update.inc("likeCount", -1);//删除点赞一次，点赞数量-1
        } else if (comment.getCommentType() == 2) {
            update.inc("commentCount", -1);//删除评论一次，评论数-1
        } else {
            update.inc("loveCount", -1);//取消喜欢，喜欢数-1
        }
        //2.3 执行更新操作
        mongoTemplate.updateFirst(query1, update, Movement.class);

        //3.返回操作类型对应的次数
        Movement movement = mongoTemplate.findById(comment.getPublishId(), Movement.class);
        if (comment.getCommentType() == 1) {
            return movement.getLikeCount();//返回点赞数量
        } else if (comment.getCommentType() == 2) {
            return movement.getCommentCount();//返回评论数
        } else {
            return movement.getLoveCount();//返回喜欢的人数
        }
    }

    //取消视频评论（点赞，喜欢，评论）
    @Override
    public Integer deleteVideoComment(Comment comment) {
        //1.从评论表删除数据
        Query query = new Query(Criteria.where("userId").is(comment.getUserId())
                .and("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType()));
        //删除评论
        mongoTemplate.remove(query, Comment.class);

        //2. 改变动态表中的被评论动态的对应操作的数量
        //2-1 使用动态id作为查询条件
        Query query1 = new Query(Criteria.where("id").is(comment.getPublishId()));
        //2.2组装更新字段
        Update update = new Update();
        if (comment.getCommentType() == 1) {
            update.inc("likeCount", -1);//删除点赞一次，点赞数量-1
        } else if (comment.getCommentType() == 2) {
            update.inc("commentCount", -1);//删除评论一次，评论数-1
        } else {
            update.inc("loveCount", -1);//取消喜欢，喜欢数-1
        }

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query1, update, Video.class);

        //3.返回操作类型对应的次数
        Video video = mongoTemplate.findById(comment.getPublishId(), Video.class);
        if (comment.getCommentType() == 1) {
            return video.getLikeCount();//返回点赞数量
        } else if (comment.getCommentType() == 2) {
            return video.getCommentCount();//返回评论数
        } else {
            return video.getLoveCount();//返回喜欢的人数
        }
    }

    //查询动态评论列表
    @Override
    public PageBeanVo findCommentByMovement(String movementId, Integer pageNum, Integer pageSize) {
        //1. 构建查询条件
        //注意:这个id必须使用new ObjectId(movementId)封装一下
        Query query = new Query(Criteria.where("publishId").is(new ObjectId(movementId)).and("commentType").is(2))
                .with(Sort.by(Sort.Order.desc("created"))).skip((pageNum - 1) * pageSize).limit(pageSize);
        // 2. 执行查询
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);

        //3.返回结果
        long count = mongoTemplate.count(query, Comment.class);
        return new PageBeanVo(pageNum, pageSize, count, commentList);
    }

    //分页查询评论列表
    @Override
    public PageBeanVo findComment(Integer commentType, Long userId, Integer pageNum, Integer pageSize) {
        //1.构建查询条件
        Query query = new Query(Criteria.where("commentType").is(commentType)
                .and("publishUserId").is(userId))
                .with(Sort.by(Sort.Order.desc("created"))).skip((pageNum - 1) * pageSize).limit(pageSize);

        //2.执行查询
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);

        //3.统计总记录数
        long count = mongoTemplate.count(query, Comment.class);
        //返回结果
        return new PageBeanVo(pageNum, pageSize, count, commentList);
    }

    //查询视频评论列表
    @Override
    public PageBeanVo findCommentByVideo(String videoId, Integer pageNum, Integer pageSize) {
        //1. 构建查询条件
        //注意:这个id必须使用new ObjectId(videoId)封装一下
        Query query = new Query(Criteria.where("publishId").is(new ObjectId(videoId)).and("commentType").is(2))
                .with(Sort.by(Sort.Order.desc("created"))).skip((pageNum - 1) * pageSize).limit(pageSize);
        // 2. 执行查询
        List<Comment> commentList = mongoTemplate.find(query, Comment.class);

        //3.返回结果
        long count = mongoTemplate.count(query, Comment.class);
        return new PageBeanVo(pageNum, pageSize, count, commentList);
    }


    //视频评论点赞
    @Override
    public Integer saveVideoCommentLike(Comment comment) {
        //1.向评论表添加数据
        comment.setCreated(System.currentTimeMillis());//创建时间
        comment.setPubType(3);//对评论进行操作
        //动态所属用户Id
        comment.setPublishUserId(mongoTemplate.findById(comment.getPublishId(), Comment.class).getUserId());
        mongoTemplate.save(comment);//保存评论

        //2. 改变视频表中的被评论动态的对应操作的数量
        //2.1 使用视频id作为查询条件
        Query query = new Query(Criteria.where("id").is(comment.getPublishId()));

        //2.2 组装更新字段
        Update update = new Update();

        update.inc(comment.getCol(), 1);//点赞一次，点赞数量+1

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query, update, Comment.class);

        //3.返回操作类型对应的次数
        Comment comment1 = mongoTemplate.findById(comment.getPublishId(), Comment.class);
        return comment1.getLikeCount();//返回点赞数量
    }

    //取消视频评论点赞
    @Override
    public Integer deleteVideoCommentLike(Comment comment) {
        //1.从评论表删除数据
        Query query = new Query(Criteria.where("userId").is(comment.getUserId())
                .and("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType()));
        //删除评论
        mongoTemplate.remove(query, Comment.class);

        //2. 改变动态表中的被评论动态的对应操作的数量
        //2-1 使用动态id作为查询条件
        Query query1 = new Query(Criteria.where("id").is(comment.getPublishId()));
        //2.2组装更新字段
        Update update = new Update();
            update.inc("likeCount", -1);//删除点赞一次，点赞数量-1

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query1, update, Comment.class);

        //3.返回操作类型对应的次数
        Comment comment1 = mongoTemplate.findById(comment.getPublishId(), Comment.class);
            return comment1.getLikeCount();//返回点赞数量
    }

    //动态评论点赞
    @Override
    public Integer saveMovementCommentLike(Comment comment) {
        //1.向评论表添加数据
        comment.setCreated(System.currentTimeMillis());//创建时间
        comment.setPubType(1);//对评论进行操作
        //动态所属用户Id
        comment.setPublishUserId(mongoTemplate.findById(comment.getPublishId(), Comment.class).getUserId());
        mongoTemplate.save(comment);//保存评论

        //2. 改变视频表中的被评论动态的对应操作的数量
        //2.1 使用视频id作为查询条件
        Query query = new Query(Criteria.where("id").is(comment.getPublishId()));

        //2.2 组装更新字段
        Update update = new Update();

        update.inc(comment.getCol(), 1);//点赞一次，点赞数量+1

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query, update, Comment.class);

        //3.返回操作类型对应的次数
        Comment comment1 = mongoTemplate.findById(comment.getPublishId(), Comment.class);
        return comment1.getLikeCount();//返回点赞数量
    }

    //取消动态评论点赞
    @Override
    public Integer deleteMovementCommentLike(Comment comment) {
        //1.从评论表删除数据
        Query query = new Query(Criteria.where("userId").is(comment.getUserId())
                .and("publishId").is(comment.getPublishId())
                .and("commentType").is(comment.getCommentType()));
        //删除评论
        mongoTemplate.remove(query, Comment.class);

        //2. 改变动态表中的被评论动态的对应操作的数量
        //2-1 使用动态id作为查询条件
        Query query1 = new Query(Criteria.where("id").is(comment.getPublishId()));
        //2.2组装更新字段
        Update update = new Update();
        update.inc("likeCount", -1);//删除点赞一次，点赞数量-1

        //2.3 执行更新操作
        mongoTemplate.updateFirst(query1, update, Comment.class);

        //3.返回操作类型对应的次数
        Comment comment1 = mongoTemplate.findById(comment.getPublishId(), Comment.class);
        return comment1.getLikeCount();//返回点赞数量
    }
}
